#pragma once;
#include"log.hpp"
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <iostream>
#include <string.h>
#define pathname "./"
#define id 0x6666
#define size 4096
Log log;

int GetKey()
{
    key_t key=ftok(pathname,id);
    if(key<0)
    {
        log(Fatal, "ftok error, error string: %s, error code: %d", strerror(errno), errno);
        exit(-1);
    }
    log(Info, "ftok success,error string: %s, error code: %d", strerror(errno), errno);
    return key;
}

//为了得到新的和旧的共享内存，通过flag来控制
int GetShareMemHelper(int flag) 
{
    key_t key=GetKey();
    //IPC_CREAT:创建一个共享内存，如果这个共享内存存在，直接获取，如果不存在就创建并返回他
    //IPC_CREAT|IPC_EXCL:
    //如果申请的共享额你存不存在,就创建,如果存在就出错返回。它可以确保如果我们申请成功了，
    //这个共享内存一定是一个新的
    int shmid=shmget(key,size,flag);
    if(shmid<0)
    {
        log(Fatal, "shmget error, error string: %s, error code: %d", strerror(errno), errno);
        exit(-2);
    }
    log(Info, "shmget error, error string: %s, error code: %d", strerror(errno), errno);
    return shmid;
}

int GetShareMem()
{
    return GetShareMemHelper(IPC_CREAT);
}

int CreateShareMem()
{
    return GetShareMemHelper(IPC_CREAT|IPC_EXCL|0666);
}